package com.redis.server.cn.service;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis服务
 *
 * @author : njl
 * @created : 2018-04-02 23:50
 */

public interface RedisTemplateService {


    /**
     * 添加缓存失效时间
     * @param key
     * @param time
     * @param timeUnit
     * @return
     * @throws Exception
     */
    boolean expire(String key,long time,TimeUnit timeUnit)throws Exception;

    /**
     * 根据key 获取过期时间
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    long getExpire(String key);

    /**
     * 判断key是否存在
     * @param key 键
     * @return true 存在 false不存在
     */
    boolean hasKey(String key);

    /**
     * 删除缓存
     * @param key 可以传一个值 或多个
     */
    void del(String ... key);

    /**
     * 插入简单数据到redis
     * @param key
     * @param value
     * @return
     */
    boolean saveStringData(String key,Object value);


    /**
     * 普通缓存放入并设置时间
     * @param key
     * @param value
     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @param  timeUnit  SECONDS-秒,MINUTES-分钟, HOURS-小时, DAYS-天
     * @return  true成功 false 失败
     */
    boolean saveStringDataAddTime(String key,Object value,long time,TimeUnit timeUnit);

    /**
     * 查找简单数据
     * @param key
     * @return
     */
    String   getStringData(String key);

    /**
     * 删除redis数据
     * @param key
     */
    void delStringData(String ... key);

    /**
     * 查找hash key 对应的值
     * @param baseKey
     * @param childkey
     * @return
     */
    String getHashData(String baseKey,String childkey);

    /**
     * 获取hashKey对应的所有键值
     * @param baseKey
     * @return
     */
    Map<Object,Object> getMapHashData(String baseKey);


    /**
     * 存hashdata
     * @param key
     * @param map
     * @return
     */
    boolean saveMapHashData(String key, Map<String,Object> map);

    /**
     *  HashSet 并设置时间
     * @param key
     * @param map
     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @param  timeUnit  SECONDS-秒,MINUTES-分钟, HOURS-小时, DAYS-天
     * @return  true成功 false 失败
     */
    boolean saveMapHashDataAddTime(String key, Map<String,Object> map, long time,TimeUnit timeUnit)throws Exception;

    /**
     * 保存数据到hash表，不存在，则新创建
     * @param key
     * @param item
     * @param value
     * @return
     */
    boolean saveOrCreateData(String key,String item,Object value) throws Exception;

    /**
     * 递增
     * @param key 键
     * @param delta 要增加几(大于0)
     * @return
     */
    long increaseCodeService(String key, long delta);

    /**
     * 递减
     * @param key 键
     * @param delta 要减少几(小于0)
     * @return
     */
    long reduceCodeService(String key, long delta);

    /**
     * 将值存入set集合
     * @param key 键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    long saveSetDatasService(String key, Object...values);

    /**
     * /**
     * 将值存入set集合，并设置时间
     * @param key 键
     * @param time 时间(秒)
     * @param values 值 可以是多个
     * @return 成功个数
     */
    long saveSetTimeDatasService(String key,long time,TimeUnit timeUnit,Object...values)throws Exception;

    /**
     * 根据key获取Set中的所有值
     * @param key 键
     * @return
     */
    Set<Object> getSetDatasService(String key);

    /**
     * 根据key查找集合中是否存在指定value
     * @param key 键
     * @param value 值
     * @return true 存在 false不存在
     */
    boolean sHasKeyService(String key,Object value);

    /**
     * 获取set缓存的长度
     * @param key 键
     * @return
     */
    long getSetDatasSizeService(String key);

    /**
     * 移除值为value的
     * @param key 键
     * @param values 值 可以是多个
     * @return 移除的个数
     */
    long removeSetDatasService(String key, Object ...values);

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    boolean saveListObjectDatasService(String key, Object value);

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    boolean saveListObjectTimeDatasService(String key, Object value,TimeUnit timeUnit, long time)throws Exception;

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    boolean saveListDatasService(String key, List<Object> value);

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    boolean saveListTimeDatasService(String key, List<Object> value,TimeUnit timeUnit, long time)throws Exception;

    /**
     * 通过索引 获取list中的值
     * @param key 键
     * @param index 索引  index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return
     */
    List<Object> getListObjectDatasService(String key);

    /**
     * 通过索引 获取list中的值
     * @param key 键
     * @param index 索引  index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return
     */
    Object getListPersionObjectDatasService(String key,long index);

    /**
     * 根据索引修改list中的某条数据
     * @param key 键
     * @param index 索引
     * @param value 值
     * @return
     */
     boolean updateListPersionObjectDatasService(String key, long index,Object value);

    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
     long removeListPersionObjectDataService(String key,long count,Object value);

}
